<?php
    namespace Core\ORM\Generateur\Classes;
    /**
     * Description of Modele
     *
     * @author mpetrini
     */
    abstract class Modele {
        public function creationFichier() {
            //Entete
            $string =   "<?php \n\t/**\n\t* Auto-généré classe ".ucfirst($this->getTable())."\n\t*/\n\n".
                        "\tclass ".ucfirst($this->getTable())." extends \Core\ORM\Modele {\n";
            //Attributs
            foreach($this->getAttributs() as $attribut) {
                $string .=  "\t\t/**\n".
                            "\t\t* @var ".$attribut->getTypeDocumente()." $".$attribut->getNomAttribut()."\n".
                            "\t\t*/\n".
                            "\t\tprotected $".$attribut->getNomAttribut().";\n";
            }
            //Constructeur
            $string .=  "\n".
                        "\t\t/**\n".
                        "\t\t* Constructeur complet\n".
                        "\t\t*\n".
                        "\t\t* @var int \$id\n";
            foreach($this->getAttributs() as $attribut) {
                $string .=  "\t\t* @var ".$attribut->getTypeDocumente()." $".$attribut->getNomAttribut()."\n";
            }
            $string .=  "\t\t*\n".
                        "\t\t* @return void\n".
                        "\t\t*/\n".
                        "\t\tpublic function __construct(\$id";
            //Paramètre du constructeur
            foreach($this->getAttributs() as $attribut) {
                $string .=  ", \$".$attribut->getNomAttribut();
            }
            $string .=  ") {\n".
                        "\t\t\tparent::__construct(\$id);\n";
            //Corps du Constructeur
            foreach($this->getAttributs() as $attribut) {
                $string .=  "\t\t\t\$this->set".\Utils\Outils::toCamelCase($attribut->getNomAttribut(), true)."(\$".$attribut->getNomAttribut().");\n";
            }
            //Fonction getAttributs
            $string .=  "\t\t}\n".
                        "\n".
                        "\t\t//GETTERS ET SETTERS\n";
            //GETTERS ET SETTERS
            foreach($this->getAttributs() as $attribut) {
                $string .=  $attribut->creationGetter().
                            $attribut->creationSetter();
            }
            $string .=  "\t\tpublic static function getAttributs() {\n".
                        "\t\t\treturn array(\n";
            $compteur = 0;
            foreach($this->getAttributs() as $attribut) {
                if($compteur > 0) {
                    $string .=  ",\n";
                }
                $string .=  "\t\t\t\t\t\t\t".$attribut->getChaineDeclaration();
                $compteur++;
            }
            //Fonction getTable
            $string .=  "\n".
                        "\t\t\t\t\t\t);\n".
                        "\t\t}\n".
                        "\n".
                        "\t\tpublic static function getTable() {\n".
                        "\t\t\treturn \"".$this->getTable()."\";\n".
                        "\t\t}\n".
                        "\t}\n".
                        "?>";
            $handle = fopen(__ADRESSE_CLASSES__.ucfirst($this->getTable()).'.php', "w");
            fwrite($handle, $string);
            fclose($handle);
            
        }
        /**
        * Crée la ligne de déclaration dans une reqûete de BDD
        * 
        * @return string
        */
        public function creationDeclarationCreateTablePrimaryKey() {
            $compteur = 0;
            $string = "";
            foreach($this->getAttributs() as $attribut) {
                if($attribut->getPrimary()) {
                    if(empty($string)) {
                        $string .=  "PRIMARY KEY (";
                    }
                    if($compteur > 0) {
                        $string .=  ",";
                    }
                    $string .=  $attribut->getNom();
                    $compteur++;
                }
            }
            if(!empty($string)) {
                $string .=  ")";
            }
            return $string;
        }
        /**
        * Crée la requête SQL pour générer la table et retourne les lignes pour créer les clés étrangères
        * 
        * @param array $tabClesEtrangeres (optional) (default=null)
        * 
        * @return string
        */
        public function creationTable(&$tabClesEtrangeres) {
            $compteur = 0;
            $string =   "CREATE TABLE ".__DATABASE__.".`".$this->getTable()."` (";
            foreach($this->getAttributs() as $attribut) {
                //Si c'est un Objet alors il y a clé étrangère
                if($attribut instanceof \Core\ORM\Attributs\Objet) {
                    $tabClesEtrangeres[] = $attribut->creationDeclarationForeignKey($this);
                }
                if($compteur > 0) {
                    $string .=  ",";
                }
                $string .=  $attribut->creationDeclarationCreateTable();
                $compteur++;
            }
            $primary = $this->creationDeclarationCreateTablePrimaryKey();
            //Si des clés primaires existent
            if(!empty($primary)) {
                $string .=  ",".$primary;
            }
            //Sinon on ajoute un attribut "id" et on le met en clé primaire
            else {
                $attribut = \Core\ORM\Attributs\Attribut::getDefautId();
                $string .=  ",".$attribut->creationDeclarationCreateTable().", PRIMARY KEY (id)";
            }
            $string .=  ") ENGINE=InnoDB;";
            return $string;
        }
        
        abstract public function getAttributs();
        abstract public function getTable();
    }
?>